/*
 * Copyright (c) 2007-2020 西安交通信息投资营运有限公司 版权所有
 */

package com.xci.xajtfb._core;

import cn.hutool.core.util.NumberUtil;
import com.github.lvyanyang.core.Const;
import com.github.lvyanyang.core.XCI;
import com.github.lvyanyang.core.BoolResult;
import com.github.lvyanyang.model.AppIdModel;
import com.github.lvyanyang.model.TokenModel;
import com.github.lvyanyang.service.CoreService;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * 交通发布Api接口拦截器
 * @author 吕艳阳 18049047588@qq.com
 * @since 2021-02-04 22:34
 */
@Component
public class XajtfbApiHandlerInterceptor implements HandlerInterceptor {
    @Resource private CoreService coreService;

    /**
     * 在请求处理之前进行调用（Controller方法调用之前）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 如果不是映射到方法直接放行
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        //检测是否包含Api请求标识
        var apiResult = XCI.hasApiRequestHeader();
        if (apiResult.isFail()) {
            XCI.writeJson(apiResult);
            return false;
        }

        //region appId检测
        AppIdModel appIdModel = coreService.getCurrentAppId();
        if (appIdModel == null) {
            XCI.writeJson(BoolResult.fail("无效的appId"));
            return false;
        }
        //endregion

        // //region 时间戳检测
        // String timestampStr = request.getHeader(Const.TIMESTAMP_HEADER_KEY);
        // if (XCI.isBlank(timestampStr) || !NumberUtil.isLong(timestampStr)) {
        //     XCI.writeJson(BoolResult.fail("请指定时间戳,请按照规范请求"));
        //     return false;
        // }
        //
        // long start = Long.parseLong(timestampStr);
        // long ts = Math.abs((System.currentTimeMillis() - start));
        // if (ts > (60 * 1000)) {
        //     XCI.writeJson(BoolResult.fail("无效的时间戳,已过期"));
        //     return false;
        // }
        //endregion

        //region 匿名访问验证
        Method method = ((HandlerMethod) handler).getMethod();
        //权限检测,确认使用者是否有权限访问此功能 类/方法上有@AllowAnonymous,允许匿名登录,直接放行
        if (XCI.IsAllowAnonymous(method)) {
            return true;
        }
        //endregion

        //region token验证
        TokenModel tokenModel = coreService.getCurrentToken();
        if (tokenModel == null) {
            XCI.writeJson(BoolResult.fail(-1001,"无效的token"));
            return false;
        }
        //endregion

        return true;
    }
}
